home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / os2 / pccts.zip / TUT4.G < prev    next >
Text File  |  1992-12-08  |  7KB  |  258 lines

  1. #header <<#include "sym.h"
  2.           #include "charbuf.h"
  3.           #define AST_FIELDS int token, level, offset; char str[D_TextSize];
  4.           #define zzcr_ast(ast,attr,tok,text) create_ast(ast,attr,tok,text)
  5.           #define DONT_CARE         0
  6.           #define SIDE_EFFECTS      1
  7.           #define VALUE             2
  8.         >>
  9.  
  10.  
  11. #token "[\t\ ]+"    << zzskip(); >>                /* Ignore White */
  12. #token "\n"         << zzline++; zzskip(); >>
  13. #token STRING "\"(~[\0-\0x1f\"\\]|(\\~[\0-\0x1f]))*\"" <<;>>
  14.  
  15. /* Not actual terminals, just node identifiers */
  16. #token DefineFunc
  17. #token SLIST
  18.  
  19.  
  20. /* Define tokens for code generation */
  21. #token DefineVar    "var"
  22. #token Mul          "\*"
  23. #token Div          "/"
  24. #token Add          "\+"
  25. #token Sub          "\-"
  26. #token Equal        "=="
  27. #token NotEqual     "!="
  28. #token If           "if"
  29. #token While        "while"
  30. #token Return       "return"
  31. #token Print        "print"
  32. #token Assign       "="        <<;>>
  33.  
  34. <<
  35. #define HashTableSize       999
  36. #define StringTableSize     5000
  37. #define GLOBAL              0
  38. #define PARAMETER           1
  39. #define LOCAL               2
  40.  
  41. static Sym *globals = NULL; /* global scope for symbols */
  42. static int current_local_var_offset=0;
  43.  
  44. create_ast(ast,attr,tok,text)
  45. AST *ast;
  46. Attrib *attr;
  47. int tok;
  48. char *text;
  49. {
  50.     Sym *s;
  51.  
  52.     ast->token = tok;
  53.     if ( tok == VAR )
  54.     {
  55.         s = zzs_get(text);
  56.         ast->level = s->level;
  57.         ast->offset = s->offset;
  58.     }
  59.     if ( tok == STRING || tok == VAR || tok == FUNC ) strcpy(ast->str, text);
  60. }
  61.  
  62.  
  63. AST *
  64. zzmk_ast(node, token, str)
  65. AST *node;
  66. int token;
  67. char *str;
  68. {
  69.     Sym *s;
  70.  
  71.     node->token = token;
  72.     if ( token == VAR )
  73.     {
  74.         s = zzs_get(str);
  75.         node->level = s->level;
  76.         node->offset = s->offset;
  77.     }
  78.     if ( token == STRING || token == VAR || token == FUNC )
  79.         strcpy(node->str, str);
  80.     return node;
  81. }
  82.  
  83.  
  84. lisp(tree)
  85. AST *tree;
  86. {
  87.     while ( tree!= NULL )
  88.     {
  89.         if ( tree->down != NULL ) printf(" (");
  90.         if ( tree->token == STRING ||
  91.              tree->token == VAR ||
  92.              tree->token == FUNC ) printf(" %s", tree->str);
  93.         else printf(" %s", zztokens[tree->token]);
  94.         lisp(tree->down);
  95.         if ( tree->down != NULL ) printf(" )");
  96.         tree = tree->right;
  97.     }
  98. }
  99.  
  100.  
  101. main()
  102. {
  103.     AST *root=NULL;
  104.  
  105.     zzs_init(HashTableSize, StringTableSize);
  106.     ANTLR(p(&root), stdin);
  107. }
  108.  
  109.  
  110. pScope(p)
  111. Sym *p;
  112. {
  113.     for (; p!=NULL; p=p->scope)
  114.     {
  115.         printf("\tlevel %d | %-12s | %-15s\n",
  116.             p->level,
  117.             zztokens[p->token],
  118.             p->symbol);
  119.     }
  120. }
  121. >>
  122.  
  123.  
  124. p!      :   <<Sym *p; AST *v;>>
  125.             (   func
  126.             |   "var" def[&globals, GLOBAL] ";"
  127.                 <<v = #(#[DefineVar], #2);
  128.                   gen(v,DONT_CARE); printf("\n"); zzfree_ast(v);
  129. /*                  lisp(v); printf("\n"); zzfree_ast(v);*/
  130.                 >>
  131.             )*
  132.             <<p = zzs_rmscope(&globals);>>
  133.             "@"
  134.         ;
  135.  
  136.  
  137. def[Sym **scope, int level]
  138.         :   <<Sym *var;>>
  139.             (   WORD
  140.                 <<zzs_scope($scope);
  141.                   var = zzs_newadd($1.text);
  142.                   var->level = $level;
  143.                   var->token = VAR;
  144.                   var->offset = current_local_var_offset++;
  145.                 >>
  146.             |   VAR
  147.                 <<var = zzs_get($1.text);
  148.                   if ( $level != var->level )
  149.                   {
  150.                     zzs_scope($scope);
  151.                     var = zzs_newadd($1.text);
  152.                     var->level = $level;
  153.                     var->token = VAR;
  154.                     var->offset = current_local_var_offset++;
  155.                   }
  156.                   else printf("redefined variable ignored: %s\n", $1.text);
  157.                 >>
  158.             )
  159.         ;
  160.  
  161.  
  162. func!   :   <<Sym *locals=NULL, *var, *p; AST *f,*parm=NULL,*v=NULL,*s=NULL;
  163.               current_local_var_offset = 0;>>
  164.             WORD
  165.             <<zzs_scope(&globals);
  166.               var = zzs_newadd($1.text);
  167.               var->level = GLOBAL;
  168.               var->token = FUNC;
  169.             >>
  170.             "\(" (  def[&locals, PARAMETER] <<parm=#1;>>
  171.                  |  <<current_local_var_offset = 1;>>
  172.                  )
  173.             "\)"
  174.             "\{"
  175.                 ( "var" def[&locals, LOCAL]
  176.                   <<if ( v==NULL ) v = #2; else v = #(NULL,v,#2);>>
  177.                   ";"
  178.                 )*
  179.                 ( statement
  180.                   <<if ( s==NULL ) s = #1; else s = #(NULL,s,#1);>>
  181.                 )*
  182.             "\}"
  183.             <<s = #(#[SLIST], s);
  184.               v = #(#[DefineVar], v);
  185.               parm = #(#[DefineVar], parm);
  186.               f = #(#[DefineFunc], #[FUNC,$1.text], parm, v, s);
  187.               gen(f,DONT_CARE); printf("\n"); zzfree_ast(f);
  188. /*              lisp(f); printf("\n"); zzfree_ast(f);*/
  189.               p = zzs_rmscope(&locals);>>
  190.         ;
  191.  
  192.  
  193. statement!: <<AST *s=NULL, *el=NULL;>>
  194.             expr ";"                            <<#0 = #1;>>
  195.         |   "\{"
  196.                 ( statement
  197.                   <<if ( s==NULL ) s = #1; else s = #(NULL,s,#1);>>
  198.                 )*
  199.             "\}"                                <<#0 = #(#[SLIST], s);>>
  200.         |   "if" "\(" expr "\)" statement
  201.             {"else" statement <<el=#2;>>}       <<#0 = #(#[If], #3, #5, el);>>
  202.         |   "while" "\(" expr "\)" statement    <<#0 = #(#[While], #3, #5);>>
  203.         |   "return" expr ";"                   <<#0 = #(#[Return], #2);>>
  204.         |   "print" expr ";"                    <<#0 = #(#[Print], #2);>>
  205.         ;
  206.  
  207.  
  208. expr    :   VAR "="^ expr
  209.         |   expr0
  210.         ;
  211.  
  212.  
  213. expr0   :   expr1 ( (   "=="^
  214.                     |   "!="^
  215.                     )
  216.                     expr1
  217.                   )*
  218.         ;
  219.  
  220.  
  221. expr1   :   expr2 ( (   "\+"^
  222.                     |   "\-"^
  223.                     )
  224.                     expr2
  225.                   )*
  226.         ;
  227.  
  228.  
  229. expr2   :   expr3 ( (   "\*"^
  230.                     |   "/"^
  231.                     )
  232.                     expr3
  233.                   )*
  234.         ;
  235.  
  236.  
  237. expr3   :   { "\-"^ } expr4
  238.         ;
  239.  
  240.  
  241. expr4!  :   <<AST *f=NULL, *arg=NULL;>>
  242.             STRING          <<#0 = #[STRING, $1.text];>>
  243.         |   VAR             <<#0 = #[VAR, $1.text];>>
  244.         |   (   FUNC        <<f  = #[FUNC, $1.text];>>
  245.             |   WORD        <<f  = #[FUNC, $1.text];>>
  246.             )
  247.             "\(" { expr <<arg=#1;>> } "\)"
  248.             <<#0 = #(f, arg);>>
  249.         |   "\(" expr "\)"  <<#0 = #2;>>
  250.         ;
  251.  
  252.  
  253. #token WORD "[a-zA-Z]+"
  254.     <<{
  255.         Sym *p = zzs_get(LATEXT(1));
  256.         if ( p != NULL ) NLA = p->token;
  257.     }>>
  258.